﻿package com.eitb.programas.diputacion{
	import flash.display.*;
	import flash.events.*;
	import fl.events.*;
	import flash.net.*;
	import flash.utils.*;
	import flash.media.*;
	import com.eitb.cargadores.*;
	import com.eitb.colecciones.*;
	import com.eitb.formaters.*;
	import com.eitb.literales.*;
	import com.eitb.reproductores.*;
	import com.eitb.imagenes.*;
	import com.eitb.programas.diputacion.rutas.*;
	import com.eitb.programas.diputacion.entidades.*;
	import com.eitb.programas.diputacion.literales.*;
	import com.eitb.util.logging.*;

	public class ModeloPresentacion implements IControladorCargador,IControladorPresentacion,IControladorVideo,IControladorGallery {
		
		private var vMain:Main;
		private var vPresentacion:IVistaPresentacion;
    	private var vVideo:IVistaVideo;
		private var vGallery:IVistaGallery;
		private var vCargador:IVistaCargador;
		private var literales:ILiterales;
		private var literalesCargador:ILiterales;
		private var bitmaps:Array;
		private var connection:NetConnection;
		private var stream:NetStream;
		private var soundChannel:SoundChannel;
		private var idioma:int;
		private var isVideoPlaying:Boolean;
		private var isAudioPlaying:Boolean;
		private var soundPosition:Number;
		private var bitmapPosition:int;
		private var loadedBitmaps:int;
		private var categoria:Categoria;

		public function ModeloPresentacion(categoria:Categoria):void {
			this.bitmaps = new Array();
			this.loadedBitmaps =0;
			this.isVideoPlaying=false;
			this.isAudioPlaying=false;
			this.bitmapPosition=0;
			this.categoria = categoria;
			
			
		}
		
		
		// INIT COMPONENTES
		public function initVista(vPresentacion:IVistaPresentacion):void {
			this.vPresentacion=vPresentacion;
			this.vPresentacion.setAudioBtnVisible(true);
			if(this.categoria.getAudio() == "") {
				this.vPresentacion.setAudioBtnVisible(false);
			}
			this.vPresentacion.setPdfBtnVisible(true);
			if(this.categoria.getPdf() == "") {
				this.vPresentacion.setPdfBtnVisible(false);
			}
			this.vPresentacion.setVideoBtnVisible(true);
			if(this.categoria.getVideo() == "") {
				this.vPresentacion.setVideoBtnVisible(false);
			}
			this.vPresentacion.setImagenBtnVisible(true);
			if(this.categoria.getImagenes().length == 0) {
				this.vPresentacion.setImagenBtnVisible(false);
			}
		}
		
		public function initMain(vMain:Main):void {
			this.vMain=vMain;
		}

		public function initVistaVideo(vVideo:IVistaVideo):void {
			this.vVideo=vVideo;
		}

	
		public function initVistaGallery(vGallery:IVistaGallery):void {
			this.vGallery=vGallery;
		}
		public function initVistaCargador(vCargador:IVistaCargador):void {
			this.vCargador = vCargador;
		}
		// INIT COMPONENTES

		// INIT PARAMETROS
		public function initIdioma(idioma:int):void {
			this.idioma=idioma;
		}

		public function initLiterales(literales:ILiterales) {
			this.literales=literales;
			this.vGallery.setAnteriorBtnText(this.literales.getLiteral(DiputacionLiterales.ANTERIOR));
			this.vGallery.setSiguienteBtnText(this.literales.getLiteral(DiputacionLiterales.SIGUIENTE));
			this.vPresentacion.setImagenBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_IMAGEN));
			this.vPresentacion.setVideoBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_VIDEO));
			this.vPresentacion.setPdfBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_PDF));
			this.vPresentacion.setAudioBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_AUDIO));			
			this.vPresentacion.setAdelanteBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_ADELANTE));
			this.vPresentacion.setMainMenuBtnText(this.literales.getLiteral(DiputacionLiterales.BOTON_MENU_PRINCIPAL));
		}

		public function initLiteralesCargador(literales:ILiterales) {
			this.literalesCargador = literales;
			this.vCargador.setCargadorInfo(this.literalesCargador.getLiteral(CargadorLiterales.DESCARGANDO));
		}

		
		private function initVideo():void {
			var obj:Object=new Object  ;
			this.connection=new NetConnection  ;
			obj.onMetaData=this.onMetaData;
			this.connection.connect(null);
			this.stream=new NetStream(this.connection);
			this.stream.client=obj;
			this.stream.addEventListener(NetStatusEvent.NET_STATUS,onStreamHandler);
			this.stream.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
			this.stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR,errorHandler);
			this.stream.bufferTime=2;
			this.vVideo.attachNetStream(this.stream);
		}
		
		private function initGallery():void {
			// inicia el puntero de imagen
			this.bitmapPosition=0;
			this.loadedBitmaps =0;
			this.bitmaps = new Array();
			var paso=0;
			var count:int = 0;
			for each (var image:String in this.categoria.getImagenes()) {
				    paso=1;
			}
			if (paso==1){
				for each ( image in this.categoria.getImagenes()) {
					loader=new OrderedLoader();
					loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImageCompleteHandler);
					loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
					loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
					loader.order = count;
					count++;
					try {
						loader.load(new URLRequest(image));
					} catch (error:Error) {
						count--;
					}
		    }
		  }  
			this.vGallery.setVisible(false);
		}
		// INIT PARAMETROS

		// FLUJO
		private function onImageCompleteHandler(evt:Event):void {
			// que se vea la primera imagen
			var loader:Loader=Loader(evt.target.loader);
			var bitmap:Bitmap=Bitmap(loader.content);
			this.bitmaps[evt.target.loader.order] = bitmap;
			this.loadedBitmaps++;
			if (this.loadedBitmaps==this.categoria.getImagenes().length) {
				this.vGallery.setImage(this.bitmaps[0]);
				this.checkGalleryButtons();
				this.vGallery.setVisible(true);
			}
			
		}
		private function progressHandler(evt:ProgressEvent):void {
			var porcentaje:Number = evt.bytesLoaded / evt.bytesTotal;
			this.vCargador.setCargadorContador(new PercentFormater(porcentaje).format(this.idioma));	
			this.vCargador.setCargadorProgress(porcentaje);			
			this.vCargador.setCargadorVisible((porcentaje != 1) && null == this.bitmaps[this.bitmapPosition]);
		}
		private function ioErrorHandler(evt:IOErrorEvent):void {
			Logger.log.info("Error I/O: "+evt.text);
		}

		private function onMetaData(info:Object) {
			Logger.log.info(info.toString());
		}

		private function errorHandler(evt:ErrorEvent):void {
			Logger.log.info("Error generico: "+evt.text);
		}

		
		
		public function start():void {
			// comprueba y prepara el video si es necesario
			if (null!=this.categoria.getVideo()) {
				this.initVideo();
			}
			// comprueba y prepara las imagenes si es necesario
			// inicia el puntero de imagen
			this.initGallery();
			// detiene audio y video
			try {
				this.stream.close();
			} catch (error:Error) {
			}
			try {
				this.soundChannel.stop();
			} catch (error:Error) {
			}
			this.vPresentacion.setTituloText(this.categoria.getName());
			this.vPresentacion.setSumarioText(this.categoria.getSumario());
			this.vPresentacion.setDescripcionText(this.categoria.getDescripcion());
		}
		
		// Start - IControladorPresentacion
		public function onVideoBtnClick(evt:MouseEvent):void {
			trace("Video: " + this.categoria.getVideo());
			if (this.isAudioPlaying) {
				this.soundChannel.stop();
			}
      		this.stream.play(this.categoria.getVideo());
			this.setVideoPlaying(true);
			if (0!=this.categoria.getImagenes().length) {
				this.vGallery.setVisible(false);
			}
			
		}
		
    	public function onPdfBtnClick(evt:MouseEvent):void {
      		trace("PDF: " + this.categoria.getPdf());
			navigateToURL(new URLRequest(this.categoria.getPdf()));
		}
		
		public function onAudioBtnClick(evt:MouseEvent):void {
			trace("Audio: " + this.categoria.getAudio());
			if (this.isVideoPlaying) {
				this.setVideoPlaying(false);
			}
			if (this.isAudioPlaying) {
				this.soundChannel.stop();
			}
		
			this.soundChannel=new Sound(new URLRequest(this.categoria.getAudio()),new SoundLoaderContext(1000)).play(0,0);
			this.isAudioPlaying=true;
			if (0!=this.categoria.getImagenes().length) {
				this.vGallery.setVisible(true);
			}
			
		}
		public function onImagenBtnClick(evt:MouseEvent):void {
			this.setVideoPlaying(false);
			this.vGallery.setVisible(true);
		}
		
		public function onAdelanteBtnClick(evt:MouseEvent):void {
			evt.currentTarget.removeEventListener(MouseEvent.CLICK, this.onAdelanteBtnClick);
			this.shutdownMedia();
			this.vMain.startDiputacion(this.categoria.getName());
		}
		
		public function onMainMenuBtnClick(evt:MouseEvent):void {
			evt.currentTarget.removeEventListener(MouseEvent.CLICK, this.onMainMenuBtnClick);
			this.shutdownMedia();
			this.vMain.startIntermedia();
		}
		
		// End - IControladorPresentacion
		
		
		// Start - IControladorVideo
		private function setVideoPlaying(playing:Boolean) {
			this.isVideoPlaying=playing;
			this.vVideo.setVisible(playing);
			if (playing) {
				this.stream.resume();
			} else {
				this.stream.pause();
			}
		}
		private function setAudioPlaying(playing:Boolean) {
			this.isAudioPlaying=playing;
			if (playing) {
				this.soundChannel=new Sound(new URLRequest(this.categoria.getAudio()),new SoundLoaderContext(1000)).play(this.soundPosition,0);
			} else {
				try {
					this.soundPosition=this.soundChannel.position;
					this.soundChannel.stop();
				} catch (error:Error) {
				}
			}
		}
		// End - IControladorVideo
		
		
		// Start - IControladorGallery
		public function onSiguienteBtnClick(evt:MouseEvent):void {
			if (++this.bitmapPosition > (this.categoria.getImagenes().length -1)) {
				this.bitmapPosition--;
			}
			this.vGallery.setImage(this.bitmaps[this.bitmapPosition]);
			this.checkGalleryButtons();
		}
		public function onAnteriorBtnClick(evt:MouseEvent):void {
			if (--this.bitmapPosition<0) {
				this.bitmapPosition++;
			}
			this.vGallery.setImage(this.bitmaps[this.bitmapPosition]);
			this.checkGalleryButtons();
		}
		// End  - IControladorGallery

		// Start - IControladorCargador
		public function addElementos(numero:int):void {

		}

		public function removeElementos(numero:int):void {

		}
		// End - IControladorCargador

		private function checkGalleryButtons():void {
			this.vGallery.setAnteriorBtnVisibile(0 != this.bitmapPosition);
			this.vGallery.setSiguienteBtnVisible(this.bitmapPosition != (this.categoria.getImagenes().length -1));
		}
		private function onStreamHandler(evt:NetStatusEvent) {
			if (evt.info.code=="NetStream.Play.Stop") {
				this.stream.close();
			}
		}
		
		private function shutdownMedia():void {
			try {
				this.vVideo.setVisible(false);
				this.stream.pause();
			} catch (error:Error) {
			}
			try {
				this.soundPosition=this.soundChannel.position;
				this.soundChannel.stop();
			} catch (error:Error) {
			}
			this.vVideo.setVisible(false);
			this.vGallery.setVisible(false);
		}

	}
}